﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace THenu.TinyHourseLib.DesignPattern.Specification_Pattern
{
    /// <summary>
    /// 规格模式,根据维基百科上的解释，是一种特殊的软件设计模式，可以使用布尔逻辑将业务规则组合在一起构成新的业务规则。
    /// 简单地说，每一粒的业务规则都是独立的并且基于单一职责的原则(SRP)，
    /// 我们可以使用加、减、非等简单逻辑将业务规则连接成为新的复合规则。这些业务规则就是我们这里说的规格
    ///// </summary>
    public interface ISpecification<T>
    {
        /// <summary>
        /// 是否符合
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        bool IsSatisfiedBy(T obj);
        /// <summary>
        /// 逻辑加
        /// </summary>
        /// <param name="objSpeci"></param>
        /// <returns></returns>
        ISpecification<T> And(ISpecification<T> objSpeci);
        /// <summary>
        /// 逻辑或
        /// </summary>
        /// <param name="objSpeci"></param>
        /// <returns></returns>
        ISpecification<T> OR(ISpecification<T> objSpeci);
        /// <summary>
        /// 逻辑非
        /// </summary>
        /// <param name="objSpeci"></param>
        /// <returns></returns>
        ISpecification<T> NOT(ISpecification<T> objSpeci);

    }
}
